/*! \file ModIntUsr.c
	\brief Modulo Interface Usuario.

	As Responsabilidades do vetor de Bits consistem em
	Gericiar os espacos livros de um certo arquivo de registros atraves de
	um arquivo binario.
 */

#define IntUsr_Serv
#include "InIntUsr.h"

//Funoes de Modulo
void TelaMenuPrincipal_IU ();//fazer com ASCII ART

void MenuCadastrarUsuario_IU ();//cementar /testar /terminar //ver se a senha e maior que 4

int ValidaCpf_IU (const char *Cpf);

void MenuLogin_IU ();//cementar /testar /terminar

void MenuLoginAdmin_IU (void);

void TelaMenuLoginAdmin_IU(ListaUsers_LN *Lista);

void LiberaListaBloqueados_IU (ListaUsers_LN *Auxil);

void LiberaListaFotos_IU (Foto_LN *Auxil);

void MenuLoginUsuario_IU (User_LN *NewUser);

int TelaMenuLoginUsuario_IU(User_LN *NewUser, int);

void MenuAlbunsPublicos_IU ();

void EditaConta_IU (User_LN *NewUser);

void LiberaUsuario_IU (User_LN *NewUser);

void DeletaAlbum_IU (User_LN *NewUser);

void AddAlbum_IU (User_LN *NewUser); //tratar e mandar pra baixo

void AddFoto_IU (User_LN *NewUser); //tratar e mandar pra baixo

int PreencheUsuario_IU (User_LN* NovoUser);

void MenuAlbunsPublicos_IU ();

void LiberaListaPublicos_IU(Album_LN *Auxil);

int TelaMenuAlbunsPublicos_IU(Album_LN *Lista);

void MenuFotosPublicas_IU (Album_LN *Auxil);

int TelaMenuAlbum_IU (Album_LN *Auxil, int);

void SelecionaAlbum_IU (User_LN *NewUser);

void MenuAlbum_IU (Album_LN *NovoAlbum);

void EditaAlbum_IU (Album_LN *NovoAlbum);

void DeletaFoto_IU (Album_LN *NewAlbum);

void SelecionaFoto_IU (Album_LN *NewAlbum);

void ExpandeFoto_IU(Foto_LN *Foto);

void EditaFoto_IU (Foto_LN *NovaFoto); //tratar e mandar pra baixo

//Fim

int ValidaCpf_IU(const char *Cpf)
{/*
    int i, j = 10, Sobra;
    int Total = 0;
    int DigitVerif;
    int cpf[12];

    for (i = 0; i < 11; i++)
    {
        cpf[i] = Cpf[i] - 48;
    }

    for (i = 0; i < 9; i++)
    {
        Total = Total + (cpf[i]*j);
        j--;
    }

    Total = Total * 10;
    Sobra = (Total/11) + 1;

    if (Sobra == 0 || Sobra == 1)
    {
     DigitVerif = 0;
    }
    else if(Sobra != 0 && Sobra != 1)
    {
    Sobra = Total%11;
    DigitVerif = Sobra;
    }

    if (DigitVerif == cpf [10])
    {
        return 0;
    }
    else
    {
        return 1;
    }
   */ return 0;
}


void TransformaString_IU (char *Strin, int Size, int Param)
{
    int i=0, j, Taman;
    char c='a';

    Taman = strlen (Strin);

    if (Taman > Size)
    {
        Strin[Size] = '\0';
    }
    else if (Taman < Size)
    {
        for (i=0; c!='\0'; i++)
        {
            c = Strin[i];
        }

        if (Param == 0)
        {
            for (j=i-1; j<Size; j++)
            {
                Strin[j]=' ';
            }
        }
        else
        {
            for (j=i-1; j<Size; j++)
            {
                Strin[j]='0';
            }
        }
        Strin[j]='\0';
    }
}

int MenuPrincipal_IU ()//cementar /testar /
{
	//variaveis
	int Opera = 0, Retor = 1;
	//Imprimindo a tela principal
	while (Retor == 1)
	{
		system ("cls");
		TelaMenuPrincipal_IU ();
		scanf ("%d", &Opera);
		switch (Opera)
		{
		case 1:
			MenuLogin_IU ();
			break;
		case 2:
			MenuCadastrarUsuario_IU ();
			break;
		case 3:
			return 0;
		default:
			return 0;
		}
	}
	return 0;
}

void TelaMenuPrincipal_IU ()//fazer com ASCII ART
{
	printf (" --- MAIN MENU --- \n\n");
	printf ("1 - Login 	\n");
	printf ("2 - Sign Up\n");
	printf ("0 - Sair 	\n");
}

void MenuCadastrarUsuario_IU ()//cementar /testar /tratar
{
	//variaveis
	char CpfDigit[12], NomeUsuar[16], Senha[5], ConfiSenha[5], Opcao = 'R';
	int ValidCpf, ValidSenha, Resul;
	int ParamConti = 1;



	while (ParamConti != 0)
	{
	    system ("cls");
		ParamConti = 0;
        getchar ();
		printf ("Digite seu cpf( Sem pontos, nem Tracos):\n");
		scanf ("%[^\n]", CpfDigit);
		TransformaString_IU(CpfDigit, 11, 1);
        getchar ();
		printf ("Digite seu nome de Usuario:\n");
		scanf ("%[^\n]", NomeUsuar);
		TransformaString_IU(NomeUsuar, 15, 0);
        getchar ();
		printf ("Digite sua senha (4 Digitos):\n");
		scanf ("%[^\n]", Senha);
		TransformaString_IU(Senha, 4, 0);
		getchar ();
		printf ("Digite sua senha novamente:\n");
		scanf ("%[^\n]", ConfiSenha);
		TransformaString_IU(ConfiSenha, 4, 0);

		ValidCpf = ValidaCpf_IU (CpfDigit);
		ValidSenha = strcmp (Senha, ConfiSenha);

		if (ValidCpf == 1)
		{
			printf ("Por favor, digite um CPF valido!\n");
			ParamConti++;

		}

		if (ValidSenha != 0)
		{
			printf ("\n\nAs senhas nao batem\n");
			ParamConti++;

		}

        if (ParamConti == 0)
        {
            Resul = AddConta_LN (CpfDigit, NomeUsuar, Senha);

            if (Resul == -2)
            {
                ParamConti++;
                printf ("CPF ja cadastrado!\n");
                system ("pause");
            }
            else if (Resul < 0)
            {
                printf ("Erro no banco de dados!\n");
                system ("pause");
                exit (1);
            }
        }
        else
        {
            getchar ();
            printf ("\n\nAperte B para voltar ou R para tentar novamente\n");
            scanf ("%c", &Opcao);
            if (Opcao == 'B' || Opcao == 'b')
            {
                ParamConti = 0;
            }
            system ("Pause");
            system ("cls");
        }
	}
}

void MenuLogin_IU ()//cementar /testar /terminar
{
	//declara variaveis
	char CpfDigit[12], Senha[5], Opcao;
	int Admin, Veri, Conti=1;
	User_LN NewUser;
	//fim

	//loop

	while (Conti != 0)
	{
	    system ("cls");
	    getchar ();
		printf ("Digite seu cpf (somente numeros):\n");
		scanf ("%[^\n]", CpfDigit);
		TransformaString_IU(CpfDigit, 11, 1);
        getchar ();
		printf ("Digite sua senha (4 Digitos):\n");
		scanf ("%[^\n]", Senha);
		TransformaString_IU(Senha, 4, 0);
		Admin = VerificaAdmin_LN (CpfDigit, Senha);
		if (Admin == 0)
		{
			Conti = 0;
			MenuLoginAdmin_IU();
		}

		else
		{
			//trata entradas
			Veri = ValidaCpf_IU (CpfDigit);
			if (Veri != 0)
			{
				printf ("\n\nPor Favor, Digite um cpf Valido\n\n");
			}
			else
			{
				strcpy (NewUser.Cpf, CpfDigit);
				strcpy (NewUser.Senha, Senha);

				Veri = FazLogin_LN (&NewUser);

				if (Veri == 0)
				{
					Conti = 0;
					MenuLoginUsuario_IU (&NewUser);
				}
				else if (Veri == -2)
				{
					printf ("\n\nUsuario nao encontrado.");
				}
				else if (Veri == -3)
				{
					printf ("\n\nVoce excedeu o numero de tentativas e foi bloqueado. Por favor, contate um administrador.");
				}
				else if (Veri == -4)
				{
					printf ("\n\nSenha incorreta.");
				}
				else
				{
					printf ("\n\nOcorreu um erro no banco de dados. Por favor, contate um administrador.");
				}
			}
		}

		if (Conti != 0)
		{
            getchar ();
			printf ("\n\nAperte B para Voltar ou R para tentar novamente\n");
			scanf ("%c", &Opcao);
			if (Opcao == 'B' || Opcao == 'b')
			{
				Conti = 0;
			}
			system ("Pause");
			system ("cls");
		}
	}
}

void MenuLoginAdmin_IU (void)
{
	ListaUsers_LN *Lista = NULL, *Auxil = NULL;
	int Veri = 0, Conti = 1, Opcao;
	char CpfDigit[12];

	while (Conti!=0)
	{
        system ("cls");
        printf ("Bem vindo admin\n");

		Veri = ListaUsuariosBloqueados_LN (&Lista);

		if (Veri == -2)
		{
			printf ("\n\nErro na alocacao de memoria");
			exit (1);
		}

		if (Lista==NULL)
		{
			printf ("\n\nNao ha usuarios bloqueados");
		}
        TelaMenuLoginAdmin_IU(Lista);

		scanf("%d", &Opcao);
		if((Opcao == 1)&&(Lista!=NULL))
		{
		    getchar();
			printf("Digite o Cpf do Usuario a Ser Desbloqueado:");
			scanf("%[^\n]", CpfDigit);
			Veri = ValidaCpf_IU (CpfDigit);
			if(Veri == 0)
			{
				Veri = DesbloqueiaUsuario_LN(CpfDigit);
				if(Veri == -2)
				{
					printf("user nao encontrado");
				}
				else if(Veri == 0)
				{
					printf("user desbloqueado com sucesso");
				}
				else
				{
					printf("Erro de Banco de dados");
				}
			}
			else
			{
				printf("CpfInvalido");
			}
		}
		else
		{
			Conti = 0;
		}

		if(Auxil != NULL)
		{
            LiberaListaBloqueados_IU (Auxil);
		}
	}
}

void TelaMenuLoginAdmin_IU (ListaUsers_LN *Lista)
{
	while (Lista != NULL)
	{
		printf ("%s\t%s\n", Lista->Cpf, Lista->Nome);
		Lista = Lista->Prox;
	}
	printf ("\n\nDigite 1 para desbloquear usuario ou 2 para sair.");
}

void LiberaListaBloqueados_IU (ListaUsers_LN *Auxil)
{
	if(Auxil->Prox != NULL)
	{
		LiberaListaBloqueados_IU (Auxil->Prox);
	}
	free(Auxil);
}


void LiberaListaFotos_IU (Foto_LN *Auxil)
{
	if(Auxil->Prox != NULL)
	{
		LiberaListaFotos_IU (Auxil->Prox);
	}
	free(Auxil);
}

void MenuLoginUsuario_IU (User_LN *NewUser)
{
	//variaveis
	int Opera, Cont = 1;

	PreencheUsuario_IU (NewUser);
	while(Cont != 0)
	{
	    system ("cls");
		TelaMenuLoginUsuario_IU(NewUser, 1);
		scanf ("%d", &Opera);
		switch (Opera)
		{
		case 1:
			AddAlbum_IU(NewUser);
			break;
		case 2:
			DeletaAlbum_IU(NewUser);
			break;
		case 3:
			AddFoto_IU(NewUser);
			break;
		case 4:
			SelecionaAlbum_IU(NewUser);
			break;
		case 5:
			MenuAlbunsPublicos_IU();
			break;
		case 6:
			EditaConta_IU(NewUser);
			break;
		case 7:
			Cont = DeletaConta_LN(NewUser->Cpf, NewUser);
			if (Cont != 0)
			{
				printf("Erro de Banco de dados!\n");
				Cont = 0;
			}
			break;
		case 8:
			Cont = 0;
			break;
		default:
			Cont = 0;
			break;
		}
	}
}

int TelaMenuLoginUsuario_IU(User_LN *NewUser, int Param)
{
    Album_LN *Lista;
    Lista = NewUser->ListaAlbum;
    int i = 1;

    printf ("\t\t    --- MEUS ALBUNS --- \n\n");

	while(Lista != NULL)
	{
		printf("%d - %s\t || %s ||\t     %d Fotos\n", i, Lista->Codig, Lista->Nome, Lista->NumerFotos);
		Lista = Lista->Prox;
		i++;
	}

    printf ("\n\n\n");

    if (Param == 1)
    {
        printf("1 - Adicionar novo album\n");
        printf("2 - Deletar album\n");
        printf("3 - Adicionar foto\n");
        printf("4 - Expandir album\n");
        printf("5 - Listar albuns Publicos\n");
        printf("6 - Editar conta\n");
        printf("7 - Deletar conta\n");
        printf("0 - Sair\n");
    }

    return i-1;
}

void EditaConta_IU (User_LN *NewUser)
{
	int Veri;

    system ("cls");

    printf("Isira os novos dados abaixo: \n");
    getchar();
	printf("Nome: ");
	scanf("%[^\n]", NewUser->Nome);
	getchar();
	printf("Senha: ");
	scanf("%[^\n]", NewUser->Senha);

	//tratar

	Veri = EditaConta_LN(NewUser->Cpf, NewUser->Nome, NewUser->Senha);

	if(Veri < 0)
	{
		LiberaUsuario_IU(NewUser);

		printf("Erro de Banco de Dados");
		exit(1);
	}
}

void LiberaUsuario_IU (User_LN *NewUser)
{
	Album_LN *ListaAlbum, *Auxil1;
	Foto_LN	*ListaFoto, *Auxil2;

	ListaAlbum = NewUser->ListaAlbum;
	while (ListaAlbum != NULL)
	{
		ListaFoto = ListaAlbum->ListaFotos;
		while(ListaFoto != NULL)
		{
			Auxil2 = ListaFoto;
			ListaFoto = ListaFoto->Prox;
			free(Auxil2);
		}
		Auxil1 = ListaAlbum;
		ListaAlbum = ListaAlbum->Prox;
		free(Auxil1);
	}
}

void DeletaAlbum_IU (User_LN *NewUser)
{
	char Album[11];
	int Verif = 0, Cont = 0;
	Album_LN *NovoAlbum;

    NovoAlbum = NewUser->ListaAlbum;
    getchar();
	printf("\nDigite o codigo do album que deseja deletar: ");
	scanf("%[^\n]", Album);
	TransformaString_IU(Album, 10, 0);

	//trata /limitar o -11111111
    while (NovoAlbum!=NULL)
    {
        if (strcmp (NovoAlbum->Codig, Album) == 0)
        {
            Cont++;
            break;
        }
        NovoAlbum = NovoAlbum->Prox;
    }

    if (Cont == 0)
    {
        printf ("Voce nao possui esse album!\n");
        system ("pause");
    }
    else
    {
        Verif = DeletaAlbum_LN (NewUser->Cpf, Album, NovoAlbum);

        if(Verif < 0)
        {
            LiberaUsuario_IU(NewUser);
            printf ("%d", Verif);
            printf("Erro de Banco de Dados");
            exit(1);
        }
    }
	LiberaUsuario_IU (NewUser);
	PreencheUsuario_IU (NewUser);
}

void AddAlbum_IU (User_LN *NewUser) //tratar e mandar pra baixo
{
	Album_LN NovoAlbum;
	int Veri;
    system ("cls");
    TelaMenuLoginUsuario_IU (NewUser, 0);
	printf ("Insira os dados do novo Album:\n");
	strcpy(NovoAlbum.Cpf, NewUser->Cpf);

    getchar ();
	printf ("Codigo: ");
	scanf ("%[^\n]", NovoAlbum.Codig);
	TransformaString_IU(NovoAlbum.Codig, 10, 0);
    getchar ();
	printf ("Nome: ");
	scanf ("%[^\n]", NovoAlbum.Nome);
	TransformaString_IU(NovoAlbum.Nome, 15, 0);
    getchar ();
	printf ("Descricao: ");
	scanf ("%[^\n]", NovoAlbum.Descr);
	TransformaString_IU(NovoAlbum.Descr, 30, 0);
	printf ("Nivel de privacidade (1 = Privado, 0 = Publico): ");
	scanf ("%d", &(NovoAlbum.Priva));
	NovoAlbum.NumerFotos = 0;

	//trata

	Veri = AddAlbum_LN (NewUser->Cpf, &NovoAlbum);
	if (Veri == -2)
	{
        printf ("Voce ja possui o numero maximo de albuns.");
        system ("pause");
		return;
	}
	else if (Veri == -200)
	{
		printf("O codigo do Album ja Existe\n");
		return;
	}
	else if(Veri < 0)
	{
		LiberaUsuario_IU(NewUser);

		printf("Erro de Banco de Dados");
		exit(1);
	}
	LiberaUsuario_IU (NewUser);
	PreencheUsuario_IU (NewUser);
}

void AddFoto_IU (User_LN *NewUser) //tratar e mandar pra baixo
{
	Foto_LN NovaFoto;
	int Respo, Veri;

    system ("cls");
    TelaMenuLoginUsuario_IU (NewUser, 0);

	printf ("Insira os dados da nova Foto:\n");
	strcpy (NovaFoto.Cpf, NewUser->Cpf);

	printf ("Deseja adicionar a foto a algum album? (1 = Sim) ");
	scanf ("%d", &Respo);

	if (Respo == 1)
	{
	    getchar ();
		printf ("Codigo: ");
		scanf ("%[^\n]", NovaFoto.CodigAlbum);
		TransformaString_IU(NovaFoto.CodigAlbum, 10, 0);
	}
	else
	{
		strcpy (NovaFoto.CodigAlbum, "-111111111");
	}
    getchar ();
	printf ("Codigo da foto: ");
	scanf ("%[^\n]", NovaFoto.CodigFoto);
	TransformaString_IU(NovaFoto.CodigFoto, 10, 0);
    getchar ();
	printf ("Nome: ");
	scanf ("%[^\n]", NovaFoto.Nome);
	TransformaString_IU(NovaFoto.Nome, 15, 0);
    getchar ();
	printf ("Data (dd/mm/aaaa): ");
	scanf ("%[^\n]", NovaFoto.Data);
	TransformaString_IU(NovaFoto.Data, 10, 0);

	printf ("Velocidade: ");
	printf ("\n\t1 - 1");
	printf ("\n\t2 - 1/2");
	printf ("\n\t3 - 1/4");
	printf ("\n\t4 - 1/8");
	printf ("\n\t5 - 1/15");
	printf ("\n\t6 - 1/30");
	printf ("\n\t7 - 1/60");
	printf ("\n\t8 - 1/125");
	printf ("\n\t9 - 1/250\n");
	scanf ("%d", &Respo);
	switch (Respo)
	{
		case 1:
			strcpy (NovaFoto.Veloc, "001");
			break;
		case 2:
			strcpy (NovaFoto.Veloc, "002");
			break;
		case 3:
			strcpy (NovaFoto.Veloc, "004");
			break;
		case 4:
			strcpy (NovaFoto.Veloc, "008");
			break;
		case 5:
			strcpy (NovaFoto.Veloc, "015");
			break;
		case 6:
			strcpy (NovaFoto.Veloc, "030");
			break;
		case 7:
			strcpy (NovaFoto.Veloc, "060");
			break;
		case 8:
			strcpy (NovaFoto.Veloc, "125");
			break;
		case 9:
			strcpy (NovaFoto.Veloc, "250");
			break;
		default:
			strcpy (NovaFoto.Veloc, "001");
	}

	printf ("Abertura: ");
	printf ("\n\t1 - 1.0");
	printf ("\n\t2 - 1.4");
	printf ("\n\t3 - 2.0");
	printf ("\n\t4 - 2.8");
	printf ("\n\t5 - 4.0");
	printf ("\n\t6 - 5.6");
	printf ("\n\t7 - 8.0");
	printf ("\n\t8 - 11.0");
	printf ("\n\t9 - 16.0\n");
	scanf ("%d", &Respo);
	switch (Respo)
	{
		case 1:
			strcpy (NovaFoto.Abert, "1.0");
			break;
		case 2:
			strcpy (NovaFoto.Abert, "1.4");
			break;
		case 3:
			strcpy (NovaFoto.Abert, "2.0");
			break;
		case 4:
			strcpy (NovaFoto.Abert, "2.8");
			break;
		case 5:
			strcpy (NovaFoto.Abert, "4.0");
			break;
		case 6:
			strcpy (NovaFoto.Abert, "5.6");
			break;
		case 7:
			strcpy (NovaFoto.Abert, "8.0");
			break;
		case 8:
			strcpy (NovaFoto.Abert, "011");
			break;
		case 9:
			strcpy (NovaFoto.Abert, "016");
			break;
		default:
			strcpy (NovaFoto.Abert, "1.0");
	}

	printf ("Iso: ");
	printf ("\n\t1 - 80");
	printf ("\n\t2 - 100");
	printf ("\n\t3 - 200");
	printf ("\n\t4 - 400");
	printf ("\n\t5 - 800\n");
	scanf ("%d", &Respo);
	switch (Respo)
	{
		case 1:
			strcpy (NovaFoto.Iso, "080");
			break;
		case 2:
			strcpy (NovaFoto.Iso, "100");
			break;
		case 3:
			strcpy (NovaFoto.Iso, "200");
			break;
		case 4:
			strcpy (NovaFoto.Iso, "400");
			break;
		case 5:
			strcpy (NovaFoto.Iso, "800");
			break;
		default:
			strcpy (NovaFoto.Iso, "080");
	}

	NovaFoto.Media = 0;
	NovaFoto.NumerVotos = 0;

	Veri = AddFoto_LN(NovaFoto.Cpf, NovaFoto.CodigAlbum, &NovaFoto);

    LiberaUsuario_IU (NewUser);
	PreencheUsuario_IU (NewUser);
}

int PreencheUsuario_IU (User_LN* NovoUser)
{
	Album_LN *ListaAlbuns = NULL;
	Foto_LN *ListaFotos = NULL;
	int Veri;

	Veri = ListaAlbunsUsuario_LN(&ListaAlbuns, NovoUser->Cpf);
	if(Veri < 0)
	{
		if(Veri == -2)
		{
			printf("Erro de Alocaçao");
			exit(2);
		}
		else
		{
			printf("Erro de Banco de Dados");
			exit(2);
		}
	}

	NovoUser->ListaAlbum = ListaAlbuns;

	while(ListaAlbuns != NULL)
	{
		PegaAlbum_LN (ListaAlbuns);
		ListaFotos = NULL;
		Veri = ListaFotosAlbum_LN(&ListaFotos, NovoUser->Cpf, ListaAlbuns->Codig);
		if(Veri < 0)
		{
			if(Veri == -2)
			{
				printf("Erro de Alocaçao");
				system ("pause");
				exit(2);
			}
			else
			{
				printf("Erro de Banco de Dados");
				system ("pause");
				exit(2);
			}
		}

		ListaAlbuns->ListaFotos = ListaFotos;
		while(ListaFotos != NULL)
		{
			PegaFoto_LN (ListaFotos);
			ListaFotos = ListaFotos->Prox;
		}
		ListaAlbuns= ListaAlbuns->Prox;
	}
	return 0;
}

void MenuAlbunsPublicos_IU ()
{
    Album_LN *Lista = NULL, *Auxil = NULL;
	int Veri, Conti=1, Opcao, Max = 0, i;


    while (Conti!=0)
	{

		Veri = ListaAlbunsPublicos_LN(&Lista);
		if (Veri == -2)
		{
			printf ("\n\nErro na alocacao de memoria");
			exit (1);
		}

		if (Lista==NULL)
		{
			printf ("\n\nNao ha Albuns Publicos");
		}

		Max = TelaMenuAlbunsPublicos_IU (Lista);

		scanf("%d", &Opcao);
		if((Opcao > 0) && (Opcao <= Max))
		{
		    Auxil = Lista;
            for(i=0; i<Opcao-1; i++)
            {
                Auxil = Auxil->Prox;
            }
            MenuFotosPublicas_IU(Auxil);
		}
		else
		{
			Conti = 0;
		}
		if (Lista!=NULL)
		{
            LiberaListaPublicos_IU (Lista);
		}
	}
}

void LiberaListaPublicos_IU(Album_LN *Auxil)
{
	if(Auxil->Prox != NULL)
	{
		LiberaListaPublicos_IU (Auxil->Prox);
	}
	free(Auxil);
}

int TelaMenuAlbunsPublicos_IU(Album_LN *Lista)
{
    int i = 1;

    system ("cls");

    printf ("\t --- ALBUNS PUBLICOS --- \n\n");
    printf ("\tDONO DO ALBUM\tCODIGO DO ALBUM\n\n");

	while (Lista != NULL)
	{
		printf ("%d - \t %s\t   %s\n", i, Lista->Cpf, Lista->Codig);
		Lista = Lista->Prox;
		i++;
	}
	printf ("\n\nEscolha o album ou digite -1 para sair.\n");
    return i-1;
}

void MenuFotosPublicas_IU (Album_LN *Auxil)
{
    Foto_LN *ListaF, *Inter;
	int Veri, Conti=1, Opcao, Voto, Max, i;

    while (Conti!=0)
	{

		Veri = ListaFotosAlbum_LN(&ListaF, Auxil->Cpf, Auxil->Codig);
		if (Veri == -2)
		{
			printf ("\n\nErro na alocacao de memoria");
			system ("pause");
			exit (1);
		}

		if (ListaF==NULL)
		{
			printf ("\n\nNao ha Fotos no album\n");
			system("Pause");
			Conti = 0;
		}
        else
        {
            Inter = ListaF;
            while (Inter!=NULL)
            {
                PegaFoto_LN(Inter);
                Inter = Inter->Prox;
            }
            Auxil->ListaFotos = ListaF;
            Inter = ListaF;
            Max = TelaMenuAlbum_IU (Auxil, 0);
            printf ("\n\nInsira o numero da foto que deseja votar (-1 para sair): ");
            scanf("%d", &Opcao);

            if((Opcao>0) && (Opcao<=Max))
            {
                for(i=0; i<Opcao-1; i++)
                {
                    ListaF = ListaF->Prox;
                }

                printf("\nInsira seu voto: ");
                scanf("%d", &Voto);
                //trata

                if(Voto < 0 || Voto > 5)
                {
                    printf ("\nVoto invalido!");
                    system ("pause");
                }
                else
                {
                    PegaFoto_LN(ListaF);
                    Veri = VotaEmFoto_LN(ListaF, Voto);
                    if(Veri < 0)
                    {
                    //trata erros
                    }
                    printf ("\nVotacao realizada com sucesso!\n\n");
                    system ("pause");
                    Conti = 0;
                }
            }
            else
            {
                Conti = 0;
            }
            LiberaListaFotos_IU (Inter);
        }
	}
}

int TelaMenuAlbum_IU (Album_LN *Auxil, int Param)
{
    int i=0;
    Foto_LN *Lista;

    system ("cls");

    Lista = Auxil->ListaFotos;

    printf ("\t\t   --- ALBUM %s ---\n\n", Auxil->Codig);
    printf ("\tCODIGO \t\t     NOME \t   PONTUACAO\n\n");
	while((Lista != NULL))// && Param !=1)
	{
        i++;
		printf("%d - \t%s\t%s\t\t%.2f\n", i, Lista->CodigFoto, Lista->Nome, Lista->Media);
		Lista = Lista->Prox;
	}

    printf ("\n\n");

    if (Param == 1)
    {
        printf("1 - Editar album\n");
        printf("2 - Visualizar foto\n");
        printf("3 - Deletar foto\n");
        printf("4 - Sair\n");
    }
	return i;
}

void SelecionaAlbum_IU (User_LN *NewUser)
{
    Album_LN *NovoAlbum;
    int Opcao, Max, i;

    system ("cls");
    Max = TelaMenuLoginUsuario_IU(NewUser, 0);
    NovoAlbum = NewUser->ListaAlbum;
    printf ("Insira o numero do album desejado: ");
    scanf ("%d", &Opcao);

    if((Opcao > 0) && (Opcao <= Max))
    {
        for(i=0; i<Opcao-1; i++)
        {
            NovoAlbum = NovoAlbum->Prox;
        }
        MenuAlbum_IU (NovoAlbum);
        LiberaUsuario_IU (NewUser);
        PreencheUsuario_IU (NewUser);
    }

    else
    {
        printf ("Album nao encontrado\n");
        system ("pause");
    }
}

void MenuAlbum_IU (Album_LN *NovoAlbum)
{
    int Opera, Cont = 1, Param;

	while(Cont != 0)
	{
		Param = TelaMenuAlbum_IU(NovoAlbum, 1);
		scanf ("%d", &Opera);
		switch (Opera)
		{
		case 1:
			EditaAlbum_IU(NovoAlbum);
			break;
		case 2:
			SelecionaFoto_IU(NovoAlbum);
			break;
		case 3:
			DeletaFoto_IU(NovoAlbum);
			break;
		default:
			Cont = 0;
			break;
		}
	}
	return;
}

void EditaAlbum_IU (Album_LN *NovoAlbum)
{
	int Veri;

	printf ("Insira os novos dados do Album:\n");
    getchar();
	printf ("Nome: ");
	scanf ("%[^\n]", NovoAlbum->Nome);
	TransformaString_IU(NovoAlbum->Nome, 15, 0);
	getchar();
	printf ("Descricao: ");
	scanf ("%[^\n]", NovoAlbum->Descr);
	TransformaString_IU(NovoAlbum->Descr, 30, 0);
	printf ("Nivel de privacidade (1 = Privado, 0 = Publico): ");
	scanf ("%d", &(NovoAlbum->Priva));

	//trata

	Veri = EditaAlbum_LN (NovoAlbum);

	if(Veri < 0)
	{
		//LiberaUsuario_IU(NewUser);
		printf("Erro de Banco de Dados");
		exit(1);
	}
}

void DeletaFoto_IU (Album_LN *NewAlbum)
{
	char Foto[11];
	int Verif = 0, Control = 0;
	Foto_LN *NovaFoto;

	getchar();
	printf("Digite o codigo da foto que deseja deletar: ");
	scanf("%[^\n]", Foto);
	TransformaString_IU(Foto, 10, 0);

    NovaFoto = NewAlbum->ListaFotos;

    while (NovaFoto != NULL)
    {
        if (strcmp (NovaFoto->CodigFoto, Foto) == 0)
        {
            Control = 1;
            break;
        }
        NovaFoto = NovaFoto->Prox;
    }
    if(Control == 1)
	{
        Verif = DeletaFoto_LN (NovaFoto->Cpf, NovaFoto->CodigAlbum, NovaFoto->CodigFoto);
	}
	else
	{
        printf("Foto Invalida\n");
        system ("pause");
	}
	if(Verif < 0)
	{
		//LiberaUsuario_IU(NewUser);
		printf("Erro no banco de dados\n");
        system ("pause");
		exit(1);
	}
}

void SelecionaFoto_IU (Album_LN *NewAlbum)
{
    Foto_LN *NovaFoto;
	int Veri = 0, Opcao, Max, i;

    Max = TelaMenuAlbum_IU (NewAlbum, 0);
    printf ("\n\nInsira a foto que deseja expandir: ");
    scanf ("%d", &Opcao);

    NovaFoto = NewAlbum->ListaFotos;

    if((Opcao > 0) && (Opcao <= Max))
    {
        for(i=0; i<Opcao-1; i++)
        {
            NovaFoto = NovaFoto->Prox;
        }
        ExpandeFoto_IU (NovaFoto);
    }
    else
    {
        printf("Opcao invalida!\n");
    }

	if(Veri < 0)
	{
		//LiberaUsuario_IU(NewUser);
		printf("Erro de Banco de Dados");
		exit(1);
	}
}

void ExpandeFoto_IU(Foto_LN *Foto)
{
    int Opcao;

	printf("\n\nNome: %s\n", Foto->Nome);
	printf("CPF: %s\n", Foto->Cpf);
	printf("Codigo do Album: %s\n", Foto->CodigAlbum);
	printf("Codigo da Foto: %s\n", Foto->CodigFoto);
	printf("Data: %s\n", Foto->Data);
	printf("Velocidade: 1/%s\n", Foto->Veloc);
	printf("Abertura: %s\n", Foto->Abert);
	printf("Iso: %s\n", Foto->Iso);
	printf("Quantidade de votos: %d\n", Foto->NumerVotos);
	printf("Media dos votos: %.2f\n", Foto->Media);

    printf ("\nMENU\n");
    printf ("1 - Editar\n");
    printf ("0 - Sair\n");
    scanf ("%d", &Opcao);

    switch (Opcao)
    {
        case 1:
            EditaFoto_IU (Foto);
        default:
            return;
    }
}

void EditaFoto_IU (Foto_LN *NovaFoto) //tratar e mandar pra baixo
{
    char Codig[11];
	int Respo, Retor;

    system ("cls");
	printf ("Insira os dados da nova Foto:\n");

	printf ("Deseja mudar a foto de album? (1 = Sim)");
	scanf ("%d", &Respo);

	if (Respo == 1)
	{
	    getchar();
		printf ("Insira o codigo do novo album: ");
		scanf ("%[^\n]", Codig);
        Retor = MudaFotoAlbum_LN (NovaFoto, Codig);
		//trata

	}
    getchar();
	printf ("Nome: ");
	scanf ("%[^\n]", NovaFoto->Nome);
	TransformaString_IU(NovaFoto->Nome, 15, 0);
	getchar();
	printf ("Data (dd/mm/aaaa): ");
	scanf ("%[^\n]", NovaFoto->Data);
	TransformaString_IU(NovaFoto->Data, 10, 0);

	printf ("Velocidade: ");
	printf ("\n   1 - 1\n");
	printf ("   2 - 1/2\n");
	printf ("   3 - 1/4\n");
	printf ("   4 - 1/8\n");
	printf ("   5 - 1/15\n");
	printf ("   6 - 1/30\n");
	printf ("   7 - 1/60\n");
	printf ("   8 - 1/125\n");
	printf ("   9 - 1/250\n");
	scanf ("%d", &Respo);
	switch (Respo)
	{
		case 1:
			strcpy (NovaFoto->Veloc, "001");
			break;
		case 2:
			strcpy (NovaFoto->Veloc, "002");
			break;
		case 3:
			strcpy (NovaFoto->Veloc, "004");
			break;
		case 4:
			strcpy (NovaFoto->Veloc, "008");
			break;
		case 5:
			strcpy (NovaFoto->Veloc, "015");
			break;
		case 6:
			strcpy (NovaFoto->Veloc, "030");
			break;
		case 7:
			strcpy (NovaFoto->Veloc, "060");
			break;
		case 8:
			strcpy (NovaFoto->Veloc, "125");
			break;
		case 9:
			strcpy (NovaFoto->Veloc, "250");
			break;
		default:
			strcpy (NovaFoto->Veloc, "001");
	}

	printf ("Abertura: ");
	printf ("\n   1 - 1.0\n");
	printf ("   2 - 1.4\n");
	printf ("   3 - 2.0\n");
	printf ("   4 - 2.8\n");
	printf ("   5 - 4.0\n");
	printf ("   6 - 5.6\n");
	printf ("   7 - 8.0\n");
	printf ("   8 - 11.0\n");
	printf ("   9 - 16.0\n");
	scanf ("%d", &Respo);
	switch (Respo)
	{
		case 1:
			strcpy (NovaFoto->Abert, "1.0");
			break;
		case 2:
			strcpy (NovaFoto->Abert, "1.4");
			break;
		case 3:
			strcpy (NovaFoto->Abert, "2.0");
			break;
		case 4:
			strcpy (NovaFoto->Abert, "2.8");
			break;
		case 5:
			strcpy (NovaFoto->Abert, "4.0");
			break;
		case 6:
			strcpy (NovaFoto->Abert, "5.6");
			break;
		case 7:
			strcpy (NovaFoto->Abert, "8.0");
			break;
		case 8:
			strcpy (NovaFoto->Abert, "011");
			break;
		case 9:
			strcpy (NovaFoto->Abert, "016");
			break;
		default:
			strcpy (NovaFoto->Abert, "1.0");
	}

	printf ("Iso: ");
	printf ("\n   1 - 80\n");
	printf ("   2 - 100\n");
	printf ("   3 - 200\n");
	printf ("   4 - 400\n");
	printf ("   5 - 800\n");
	scanf ("%d", &Respo);
	switch (Respo)
	{
		case 1:
			strcpy (NovaFoto->Iso, "080");
			break;
		case 2:
			strcpy (NovaFoto->Iso, "100");
			break;
		case 3:
			strcpy (NovaFoto->Iso, "200");
			break;
		case 4:
			strcpy (NovaFoto->Iso, "400");
			break;
		case 5:
			strcpy (NovaFoto->Iso, "800");
			break;
		default:
			strcpy (NovaFoto->Iso, "080");
	}

	EditaFoto_LN (NovaFoto);
}
